package Syntaxe;

public class Fraction {

	int numerateur; //
	int denominateur; // FenMu

	public Fraction(int i, int j) {
		numerateur = i;
		denominateur = j;
	}

	public Fraction(int i) {
		// change int to Fraction
		numerateur = i;
		denominateur = 1;
	}

	public static int PGCD(int n, int m) {
		for (int i = 0; i < Math.sqrt(n); i++) {
			// TODO

		}
		return 1;
	}

	public Fraction simplify() {
		// return le plus simple form de une fraction
		if 	(numerateur==0){
			return new Fraction(0);
		}	

		if ((denominateur == 1) || (denominateur == 1)) {
			return this;
		}
		
if (denominateur % numerateur == 0) {
			return new Fraction(1, denominateur / numerateur);
		}
		for (int i = 2; i < numerateur / 2 + 1; i++) {
			if (numerateur % i == 0) {
				if (denominateur % i == 0) {
					return new Fraction(numerateur / i, denominateur / i)
							.simplify();
				}
			}

		}
		return this;
	}

	public Fraction plus(Fraction f) {
		if (denominateur == f.denominateur) {
			return new Fraction(numerateur + f.numerateur,denominateur);
		}

		Fraction g = new Fraction(numerateur * f.denominateur + denominateur
				* f.numerateur, denominateur * f.denominateur);
		return g.simplify();
	}

	public Fraction plus(int i) {

		Fraction g = new Fraction(numerateur + denominateur * i, denominateur);
		return g;
	}

	public Fraction multiple(Fraction f) {

		Fraction g = new Fraction(numerateur * f.numerateur, denominateur
				* f.denominateur);
		if (g.numerateur == 0) {
			return new Fraction(0);
		}
		return g.simplify();
	}

	public Fraction multiple(int i) {
		if (i == 0) {
			return new Fraction(0);
		}
		if (denominateur % i == 0) {
			return new Fraction(numerateur, denominateur / i);
		}
		Fraction g = new Fraction(numerateur * i, denominateur);
		return g;
	}

	public Fraction divise(Fraction f) {
		Fraction g = new Fraction(numerateur * f.denominateur, denominateur
				* f.numerateur);
		return g.simplify();
	}

	public Fraction divise(int i) {
		if (numerateur % i == 0) {
			return new Fraction(numerateur/i, denominateur);
		}
		Fraction g = new Fraction(numerateur, denominateur * i);
		return g;
	}

	public Fraction soustraire(Fraction f) {
		Fraction g = new Fraction(numerateur * f.denominateur - denominateur
				* f.numerateur, denominateur * f.denominateur);
		return g.simplify();
	}

	public Fraction soustraire(int i) {
		Fraction g = new Fraction(numerateur - denominateur * i, denominateur);
		return g;
	}

	public boolean isZero() {
		if (numerateur == 0) {
			return true;
		}
		return false;
	}

	public boolean strictPositive() {
		if ((numerateur > 0 && denominateur > 0)
				|| (numerateur < 0 && denominateur < 0)) {
			return true;
		}
		return false;
	}

	public boolean strictNegative() {
		if ((numerateur > 0 && denominateur < 0)
				|| (numerateur < 0 && denominateur > 0)) {
			return true;
		}
		return false;
	}
	public int signum(){
		if (this.strictPositive()){
			return 1;
		}
		if(this.strictNegative()){
			return -1;
		}
		return 0;
	}

	public boolean PlusGrandQue(Fraction f) {
		// true: this>=f

		if ( (f.multiple(-1).plus(this)).strictNegative()) {
			return false;
		}else{
		return true;
		}
	}

	public boolean PlusGrandQue(int i) {
		// true: this>=i
		if ( (new Fraction(-1*i).plus(this)).strictNegative()) {
			return false;
		}else{
		return true;}
	}

	public double toDouble() {
		double d = (double) numerateur / (double) denominateur;
		return d;
	}

	public void print() {
		System.out.print(numerateur + "/" + denominateur);
	}
}
